package com.hayato.gpstweet.controller.twitter;

import java.util.List;

import org.mobylet.core.Mobylet;
import org.mobylet.core.MobyletFactory;
import org.mobylet.core.gps.Gps;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.util.ServletContextLocator;

import twitter4j.Tweet;
import twitter4j.TwitterException;

import com.hayato.gpstweet.service.TwitterService;

public class ShowController extends Controller {
    private TwitterService service = new TwitterService();

    // 位置情報の取得
    protected Gps getGps() {
        // MobyletインスタンスからGPSを取得する。
        Mobylet mobylet = MobyletFactory.getInstance();
        Gps gps = mobylet.getGps();
        return gps;
    }

    // 位置情報による検索
    @Override
    public Navigation run() throws Exception {
        Double latitude, longitude;
        // ズームレベル（デフォルト値を設定）
        Integer mapzoom = TwitterService.DEFAULT_MAPZOOM;
        
        // 位置情報を取得していない場合
        if (requestScope("latitude") == null) {
            Gps gps = getGps();
            latitude = gps.getLat();
            longitude = gps.getLon();
            // 位置情報をリクエストに保存する
            requestScope("latitude", latitude);
            requestScope("longitude", longitude);
            // ズームレベルをリクエストに保存する
            requestScope("mapzoom", mapzoom);
        } else {
            // リクエストから位置情報を取得する
            latitude = asDouble("latitude");
            longitude = asDouble("longitude");
        }
        
        // 位置情報を指定して、TwitterServiceを呼び出す
        List<Tweet> tweetList = 
            service.search(latitude, longitude).getTweets();
        requestScope("tweets", tweetList);

        // GoogleMapsの画像URI作成
        createMap(latitude, longitude);
        
        return forward("show.jsp");
    }
    
    // GoogleMapsの画像URI作成
    private void createMap(Double latitude, Double longitude)
            throws TwitterException {
        
        // ツィートの位置情報をmarkers形式で取得する
        String tweetLocation = getTweetLocation();
        // ズームレベルをリクエストから取得する
        Integer mapzoom = asInteger("mapzoom");
        // GoogleMapの画像URI作成
        String mapURI = 
            service.getMapURI(latitude, longitude, tweetLocation, mapzoom);
        requestScope("mapURI", mapURI);
    }
    
    // ツィートの位置情報をmarkers形式で取得する
    private String getTweetLocation() {
        List<Tweet> tweetList = requestScope("tweets");
        // ツィートの位置情報をmarkers形式にする
        String tweetLocation = "";
        for (int i = 0; i < tweetList.size(); i++) {
            Tweet tweet = tweetList.get(i);
            if (tweet.getGeoLocation() != null) {
                tweetLocation +=
                    "&markers=label:" + i + "|size:mid|color:red|"
                        + tweet.getGeoLocation().getLatitude() + ","
                        + tweet.getGeoLocation().getLongitude() + "&";
            }
        }
        return tweetLocation;
    }
    
    // ローカル開発環境かどうか
    protected boolean isLocal(){
        return ServletContextLocator.get().getServerInfo().indexOf("Development") >= 0;
    }
    
    // エラーハンドル
    @Override
    protected Navigation handleError(Throwable error) {
        // ローカル開発環境の場合
        if (isLocal()){
            throw new RuntimeException(error);
        }
        // エラー画面にリダイレクトする
        return redirect("error");
    }

}
